﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SalaDeEnsayo.ApplicationService.Model.Entity;

namespace SalaDeEnsayo.ApplicationService
{
    public class SalaService : BaseService
    {
        #region [ Metodos Publicos ]
        /*
        public List<Sala> GetAll()
        {
            List<Sala> listaSala = new List<Sala>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("SalasObtener"))
            {
                while (dr.Read())
                {
                    listaSala.Add(GetEntity(dr));
                }
            }
            return listaSala;
        }
        */

        public List<SalaDTO> Listar(string filtro)
        {
            List<SalaDTO> lista = new List<SalaDTO>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("SalasObtener2", filtro))
            {
                while (dr.Read())
                {
                    lista.Add(GetEntityDTO(dr));
                }
            }
            return lista;
        }

        public Sala ObtenerPorId(long id)
        {
            Sala Sala = new Sala();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("SalasObtenerPorId", id))
            {
                if (dr.Read())
                {
                    Sala = GetEntity(dr);
                    return Sala;
                }
            }
            return Sala;
        }

        public List<Sala> ObtenerSalas()
        {
            List<Sala> listaSala = new List<Sala>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("SalasObtener"))
            {
                while (dr.Read())
                {
                    listaSala.Add(GetEntity(dr));
                }
            }
            return listaSala;
        }

        public int AgregarSala(Sala Sala)
        {
            Object[] parms = new Object[2];
            parms[0] = Sala.Nombre;
            parms[1] = Sala.Descripcion;

            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("SalasAgregar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int EliminarSala(long id)
        {
            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("SalasEliminar", id);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int ModificarSala(Sala newSala)
        {
            Object[] parms = new Object[3];
            try
            {
                parms[0] = newSala.Id_Sala;
                parms[1] = newSala.Nombre;
                parms[2] = newSala.Descripcion;


                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("SalasModificar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public Boolean TieneDependencias(long id_sala)
        {
            int res = (int)this.SalaDeEnsayoDB.ExecuteScalar("SalasPuedeBorrar", id_sala);

            if (res > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        public Boolean PuedeInsetar(string nombre)
        {

            if ((int)this.SalaDeEnsayoDB.ExecuteScalar("SalasPuedeInsertar", nombre) == 0)
            {
                return false;
            }
            else
            {
                return true;
            }

        }

        #endregion

        #region [ Metodos Privados ]

        private Sala GetEntity(System.Data.IDataReader dr)
        {
            return new Sala(dr["id_sala"] is System.DBNull ? 0 : (int)dr["id_sala"],
                            dr["nombre"] is System.DBNull ? string.Empty : (string)dr["nombre"],
                            dr["descripcion"] is System.DBNull ? string.Empty : (string)dr["descripcion"]);
        }

        private SalaDTO GetEntityDTO(System.Data.IDataReader dr)
        {
            return new SalaDTO(dr["id_Sala"] is System.DBNull ? 0 : (int)dr["id_Sala"],
                               dr["Nombre"] is System.DBNull ? string.Empty : (string)dr["Nombre"],
                               dr["descripcion"] is System.DBNull ? string.Empty : (string)dr["descripcion"]);
        }

        #endregion
    }

    public class SalaDTO
    {
        public SalaDTO(int Sala, string Nombre, string desc)
        {
            this.Id_Sala = Sala;
            this.Nombre = Nombre;
            this.Descripcion = desc;
        }

        public SalaDTO() { }

        public int Id_Sala { get; set; }
        public string Nombre { get; set; }
        public string Descripcion { get; set; }
    }

}
